[
       
 

Math-Objekt

Hier sind ab jetzt vor allem Algorithmen zum numerischen Lösen von mathematischen Problemen zu finden. Allen Algorithmen sind von dieser Seite aus verwendbar, natürlich sind sie auch zum Download bereitgestellt. Die Algorithmen werden unter einem Objekt "Math2" zusammengefasst.


Gaußscher Algorithmus mit teilweiser Pivotisierung

Der Gaußsche Algorithmus formt das Gleichungssystem in eine Dreiecksform um, indem er ein vielfaches einer Zeile zu einer anderen so hinzuaddiert, dass das erste Element Null wird. Anschließend wird das Gleichungssystem rekursiv aufgelöst.
Top


Quellcode:
function Math2_Gauss(A, b, eps)
  {
  var n = A.length-1
  var p, maxp, maxz, z, i, q, k, s;
  var x = new Array(A.length);
  for(var is = 0; is < n; is++)  // Pivotisierung
    {
    p = is;
    maxp = Math.abs(A[p][is]);
    for(i = is+1; i <= n; i++)  // Pivotelement p suchen
      {
      maxz = Math.abs(A[i][is]);
      if(maxz > maxp)
        {
        maxp = maxz;
        p = i;
        }
      }
    if(maxp > eps)  // Prüfen ob größer Null bzw. Epsilon
      {
      if(p != is)  // Zeilen tauschen
        {
        z = A[is];
        A[is] = A[p];
        A[p] = z;
        z = b[is];
        b[is] = b[p];
        b[p] = z;
        }
      }
      else
        {
        alert("Fehler bei Lösung des Gleichungssystem:\n\n\tdet(A) = 0\n\tPivotelement = 0");
        return null;
        }
    for(i = 1+is; i <= n; i++)  // Gaußscher Algorithmus
      {
      q = A[i][is]/A[is][is];
      for(k = is+1; k <= n; k++) A[i][k] = A[i][k] - q*A[is][k];
      b[i] = b[i] - q*b[is];
      }
    }
  if(Math.abs(A[n][n]) >= eps)
    {
    for(i = n; i > -1; i--)  // Rückwertsauflösung
      {
      s = 0;
      for(k = i+1; k <= n; k++) s += A[i][k]*x[k];
      x[i] = (b[i]-s) / A[i][i];
      }
    }
    else
      {
      alert("Fehler bei Lösung des Gleichungssystem:\n\n\tdet(A) = 0");
      return null;
      }
  return x;
  }
  
Top | Gaußscher Algorithmus


Beispiel:
Koeffizientenmatrix A:
(Spaltentrennung ','; Zeilentrennung '\n')
Konstandenvektor b:
(Trennung ',')
Fehlerfaktor ε:
(ε << 1)
Lösungsvektor x:

Top | Gaußscher Algorithmus


Gauß-Jordan-Verfahren mit teilweiser Pivotisierung

Das Gauß-Jordan-Verfahren stellt eine Modifikation des Gaußschen Algorithmus dar. Bei diesem Verfahren zum Lösen von Gleichungssystemen wird die Koeffizientenmatrix in eine Einheitsmatrix überführt, so das der Lösungsvektor dem modifizierten Konstantenvektor entspricht. Ein rekursives Auflösen wird überflüssig.
Top


Quellcode:
function Math2_GaussJordan(A, b, eps)
  {
  var n = A.length-1;
  var is, k, i, ism1, Q;
  for(is = 0; is <= n; is++)
    {
    // Pievotisierung:
    p = is;
    maxp = Math.abs(A[p][is]);
    for(i = is+1; i <= n; i++)  // Pivotelement p suchen
      {
      maxz = Math.abs(A[i][is]);
      if(maxz > maxp)
        {
        maxp = maxz;
        p = i;
        }
      }
    if(maxp > eps)  // Prüfen ob größer Null bzw. Epselon
      {
      if(p != is)  // Zeilen tauschen
        {
        z = A[is];
        A[is] = A[p];
        A[p] = z;
        z = b[is];
        b[is] = b[p];
        b[p] = z;
        }
      }
      else
        {
        alert("Fehler bei Lösung des Gleichungssystem:\n\n\tdet(A) = 0\n\tPivotelement = 0");
        return null;
        }
    // GaussJordan:
    for(k = is+1; k <= n; k++) A[is][k] = A[is][k]/A[is][is];
    b[is] = b[is]/A[is][is];
    ism1 = is-1;
    for(i = 0; i <= ism1; i++)
      {
      Q = A[i][is];
      for(k = is+1; k <= n; k++)
        {
        A[i][k] -= Q*A[is][k];
        }
      b[i] -= Q*b[is];
      }
    for(i = is+1; i <= n; i++)
      {
      Q = A[i][is];
      for(k = is+1; k <= n; k++)
        {
        A[i][k] -= Q*A[is][k];
        }
      b[i] -= Q*b[is];
      }
    }
  return b;
  }
  
Top | Gauß-Jordan-Verfahren


Beispiel:
Koeffizientenmatrix A:
(Spaltentrennung ','; Zeilentrennung '\n')
Konstandenvektor b:
(Trennung ',')
Fehlerfaktor ε:
(ε << 1)
Lösungsvektor x:

Top | Gauß-Jordan-Verfahren


Newton-Verfahren

Das Newton-Verfahren bestimmt über einen Startpunkt analytisch die Funktionstangete um damit die Nullstelle zu approximieren. Das hier gezeigte Script findet allerdings nur reelle Nullstellen bei ganzrationalen Polynomen. Prinzipiell kann das Newton-Verfahren aber auch auf andere Funktionstypen übertragen werden.
Top


Quellcode:
function Math2_Newton(A, x2, itermax, eps1, eps2)
  {
  var x1;
  var fx, fsx;
  var B, C, i, nm1;
  var iter = 0;
  do
    {
    if(iter < itermax)
      {
      iter++;
      x1 = x2;

      // Horner-Schema für Funktionswert und Wert der ersten Ableitung:
      B = A[0]*x1 + A[1];
      C = A[0]*x1 + B;
      nm1 = A.length-1;
      for(i = 2; i < nm1; i++)
        {
        B = B*x1 + A[i];
        C = C*x1 + B;
        }
      fx = B*x1 + A[nm1];
      fsx = C;

      // Division durch NULL verhinern:
      if(fsx == 0)
        {
        alert("Division durch NULL\nProgrammabbruch");
        return x2;
        }

      x2 = x1 - fx/fsx;
      }
    else
      {
      alert("ITERMAX erreicht\nProgrammabbruch");
      return x2;
      }
    } while(Math.abs(fx) > eps1 && Math.abs(x2-x1) > eps2);
  return x2;
  }
  
Top | Newton-Verfahren


Beispiel:
Koeffizientenvektor A:
(Trennung ',')
Startwert:
max. Iterationsschritte:
Fehlerfaktoren ε:
(ε << 1)
1. 2.
Lösung: x =

Top | Newton-Verfahren

   
[Home] [Menu-Objekt] [Graphics-Objekt] [Math-Objekt] [Objekte u. Funktionen] [alte Scripts] [Copyrigth] [News & Infos] [Info] [Privat] [HTW|Schule] [Webwanze]


© 2001-2003 Roland Steffen

Designed by Microsoft Notepad